package settings

import (
	"fmt"

	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
)

// 日志配置结构体
type LogConfig struct {
	Level      string `mapstructure:"level"`
	FileName   string `mapstructure:"filename"`
	MaxSize    int    `mapstructure:"max_size"`
	MaxAge     int    `mapstructure:"max_age"`
	MaxBackups int    `mapstructure:"max_backups"`
}

// mysql配置结构体
type MySQLConfig struct {
	Host         string `mapstructure:"host"`
	User         string `mapstructure:"user"`
	PassWord     string `mapstructure:"password"`
	DB           string `mapstructure:"db"`
	Port         int    `mapstructure:"port"`
	MaxOpenConns int    `mapstructure:"max_open_conns"` // 限制同时打开的连接数（使用中+空闲）,默认无限制
	MaxIdleConns int    `mapstructure:"max_idle_conns"` // 设置最大并发空闲连接数，sqlx的sql.DB会在连接池中最多保留2个空闲连接
}

// 项目配置封装结构体
type AppConfig struct {
	Mode         string `mapstructure:"model"`
	Port         int    `mapstructure:"port"`
	*LogConfig   `mapstructure:"log"`
	*MySQLConfig `mapstructure:"mysql"`
}

// 全局配置变量
var Conf = new(AppConfig)

func Init() error {
	viper.SetConfigFile("./conf/config.yaml") // 指定配置文件路径

	viper.WatchConfig() // 监控配置文件变化
	// 配置文件发生变化后要同步到全局变量Conf
	viper.OnConfigChange(func(in fsnotify.Event) { // 使用fsnotify库监听
		fmt.Println("配置文件被人修改啦！")
		// 重新读取，保存到conf
		if err := viper.Unmarshal(Conf); err != nil {
			panic(fmt.Errorf("unmarshal conf failed, err: %s ", err))
		}
	})

	err := viper.ReadInConfig() // 读取配置信息
	if err != nil {             // 读取配置信息失败
		panic(fmt.Errorf("read config failed, err: %s ", err))
	}
	// 将读取的配置信息保存至全局变量Conf
	if err := viper.Unmarshal(Conf); err != nil {
		panic(fmt.Errorf("unmarshal conf failed, err: %s", err))
	}
	return err
}
